package com.kgc.scd.config;

import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Created On : 2022/10/18 0018.
 * <p>
 * Author : shiguangchuan
 * <p>
 * Description: Redis自定义配置类，实现一个自定义序列化方式的redisTemplate，来替换掉默认配置的redisTemplate，实现String类型的key和任意类型的value
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 自定义redisTemplate的模板对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        // 设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);

        // 由于要通过程序操作远程的redis数据库，必须支持序列化，才可以让程序中的数据，在网络中传输
        // 定义String序列化方式，可以序列化字符串对象
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // 定义fastjson序列化方式，可以序列化任何对象
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);

        // 需改为新的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);


        // 初始化为新的模板
        template.afterPropertiesSet();

        return template;
    }

}
